package com.cskaoyan.javase.oop2._1extends._8initialization._4super;

/**
 * this vs super
 * 在一个子类对象当中:
 *      1.this指向当前子类对象,它真的指向一个对象,它就是一个引用
 *          this是类中成员方法,构造器,构造代码块(构造代码块就是构造器)
 *          的一个隐式传参
 *          所以它就是一个局部变量引用,指向当前对象
 *
 *      2.super指向子类对象中父类成员的区域,它指向的不是一个对象,它不是一个引用
 *          但是可以近似的看成指向一个父类对象
 *
 *
 * 从使用上来说:
 *      可以认为this指向子类自身对象,super指向它的直接父类对象
 *      所以能够用this关键字的地方,都是可以用super的
 *      它们的使用基本是完全一样的
 *
 * this的使用范围更广,它包含了super,因为父类成员终究存在子类对象中
 * super范围更窄,只能访问父类成员
 *
 * 它们的区别主要有以下:
 *      1.当存在父子类同名成员时,this和super分别指向各自成员
 *          这时就可以用来区分同名成员了.
 *      2.this在自身类中不受权限限制
 *          但是super指向父类成员,受权限限制
 *          如果父类成员是私有的,或者没有访问权限,是访问不到的
 *      3.super并不指向对象,不是一个引用
 *          可以super.使用它
 *          但不能输出它
 *
 * @since 14:53
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Son();
    }
}

class Father {
    private int num = 666;
    public void test(){
        System.out.println("xxx");
    }
}

class Son extends Father {
    private int num = 888;
    int num2 = 777;
    public void test(){
        System.out.println("yyy");
    }
    {
        System.out.println(this.num);
        System.out.println(this.num2);
        // System.out.println(super.num);
        System.out.println(this);
        // System.out.println(super);
        this.test();
        super.test();
    }
}